
// WARNING! if you cange the size of this file (719 bytes) 
// you have to change the jump in npc_collision_code_for_exp.txt
// The offset you have to make it jump to is :money_boi, just preview the 
// and lables to find the new offset if you add more code

#define

Money_owned = [499C5C]

#enddefine





offset 4265B0 

PUSH EBP
MOV EBP,ESP
SUB ESP,4
setpointer
CMP DWORD PTR DS:[499C88],5
JE :BK_fall_sideways
CMP DWORD PTR DS:[499C88],6
JNE :normal_gravity


:BK_fall_sideways                                                                                                
cmp npc.scriptstate, 0
jne :fly_dir_set
mov npc.scriptstate, 1
PUSH 80  
PUSH -80
CALL 0040F350
ADD ESP,8
mov npc.moveY,EAX
PUSH 100 
PUSH 7F
CALL 40F350
ADD ESP,8
mov npc.moveX,EAX
:fly_dir_set
sub npc.moveX, 8 //gravity
CMP npc.x ,-A000 //delet if fall of left of map
JGE :dont_delet
mov npc.inuse, 0
:dont_delet
cmp npc.moveX,-600
JGE :speedcap_fall_left
mov npc.moveX,-600
:speedcap_fall_left
MOV ECX, npc.collision
AND ECX,00000001  //left wall
JE :no_left_bounce
MOV npc.moveX,100  //bounce off wall
:no_left_bounce
MOV ECX,npc.collision
AND ECX,00000002
JE :add_vels
MOV npc.movey ,40
MOV ECX,npc.collision
AND ECX,00000008 //down
JE :add_vels
MOV npc.moveY,-40
JMP :add_vels


:normal_gravity
CMP npc.scriptstate,0
JNE :setup_done_ANP
mov npc.scriptstate, 1
PUSH 4                                              
PUSH 0                                               
CALL 0040F350                                        
ADD ESP,8
setpointer
MOV npc.framenum,EAX
PUSH 200
PUSH -200 
CALL 0040F350                                        
ADD ESP,8
MOV npc.moveX,EAX
PUSH 0                                                ;  Arg2 = 0
PUSH -400                                             ;  Arg1 = -400
CALL 0040F350                                         ;  Doukutsu.0040F350
ADD ESP,8
MOV npc.moveY,EAX
PUSH 1                                                ;  Arg2 = 1
PUSH 0                                                ;  Arg1 = 0
CALL 0040F350                                         ;  Doukutsu.0040F350
ADD ESP,8
TEST EAX,EAX
JE :dir_2
mov npc.direction, 0
jmp :setup_done_ANP
:dir_2
mov npc.direction, 2



:setup_done_ANP
MOV EAX,npc.collision
AND EAX,00000100 //water
JE :col_100_no
add npc.moveY, 15
JMP :gravity_set
:col_100_no
add npc.moveY, 2A
:gravity_set

mov edx npc.collision
AND EDX,00000001 //left wall
JE :L_wall_done
neg npc.moveX
:L_wall_done


mov edx npc.collision
AND EDX,00000004 //right wall
JE :R_wall_done
neg npc.moveX
:R_wall_done







mov edx npc.collision
AND EDX,00000002 //celing
JE :Celing_done
add npc.moveY 100
:Celing_done




mov edx npc.collision
AND EDX,00000008 //floor
JE :floor_done
PUSH 1
PUSH 2D
CALL 00420640
ADD ESP,8
MOV npc.moveY,-280
mov eax, npc.movex
SHL EAX,1
CDQ
MOV ECX,3
IDIV ECX
MOV npc.moveX,EAX


:floor_done
MOV EBX,npc.collision
AND EBX,0000000D   //L, R and D
JE :yo'_nibba
PUSH 1 
PUSH 2D 
CALL 00420640                                         ;  Doukutsu.00420640
ADD ESP,8
inc npc.directive

CMP npc.directive,2
JLE SHORT :no_reset_directive
add npc.Y, -200
JMP SHORT :no_reset_directive

:yo'_nibba
MOV npc.directive,0
:no_reset_directive
//speed caps

mov eax npc.moveX
cmp eax, 5FF
jl :speed_ok_H_positive
mov npc.moveX, 5FF
:speed_ok_H_positive
cmp eax, -5FF
jg :speed_ok_H_negative
mov npc.moveX, -5FF
:speed_ok_H_negative
mov eax npc.moveY
cmp eax, 5FF
jl :speed_ok_V_positive
mov npc.moveY, 5FF
:speed_ok_V_positive
cmp eax, -5FF
jg :speed_ok_V_negative
mov npc.moveY, -5FF
:speed_ok_V_negative

:add_vels
mov eax, npc.moveX
mov edx, npc.moveY
add npc.X eax
add npc.Y edx

inc npc.frametimer
CMP npc.direction,0
JNE :not_left
//dir_left_frame_thing
CMP npc.frametimer,2
JLE :frame_thing_dir_set
MOV npc.frametimer,0
inc npc.framenum
CMP npc.framenum,5
JLE :frame_thing_dir_set
mov npc.framenum, 0
JMP :frame_thing_dir_set
:not_left
//dir_right_frame_thing
CMP npc.frametimer,2
JLE :frame_thing_dir_set
MOV npc.frametimer,0
dec npc.framenum
cmp npc.framenum, 0
JGE :frame_thing_dir_set
mov npc.framenum, 5
:frame_thing_dir_set

inc npc.objecttimer
CMP npc.objecttimer,1F4
JLE :do_not_delet_plz
MOV byte npc.inuse, 0  //delet npc
jmp :end_of_code

:do_not_delet_plz
CMP npc.objecttimer,190
JLE :render_plz
//blinking before dissappear
cmp npc.scripttimer, 0
je :ok_render
dec npc.scripttimer
xor eax, eax
mov npc.displayL, eax
mov npc.displayR, eax 
jmp :end_of_code


:ok_render
xor eax, eax
mov [ebp-4], eax     // because that's a good idea
inc npc.scripttimer
:render_plz
mov eax, npc.framenum
mov edx, 10 
imul eax,edx   
mov npc.displayL, eax
add eax, 10
mov npc.displayR, eax 


CMP npc.exp,5
JE :medium_exp_render
JL :little_render
//CMP npc.exp,14
//JL :render_UD

//big render
mov edx, 20
jmp :render_UD

:little_render
xor edx, edx
JMP :render_UD

:medium_exp_render
mov edx, 10
JMP :render_UD

:render_UD
add edx, 10 //U_framerect_distance

mov npc.displayU, edx
add edx, 10
mov npc.displayD, edx

:end_of_code
MOV ESP,EBP
POP EBP
RETN

data CC

:money_boi
MOV EDX,DWORD PTR DS:[ECX+4A6264]
data 90 90 90 90 90 90               //add Money_owned edx if you want money to be gettable from exp as well
PUSH EDX
CALL 004196F0          //add exp
POP ECX
MOV EAX,DWORD PTR SS:[EBP-4]
IMUL EAX,EAX,0AC
MOV BYTE PTR DS:[EAX+4A6220],0
jmp 419186


//--------------------------------
//--------offset is 42687f--------
//--------------------------------

//this is the money code because I saved enough space from the dorito re-write so I 
//just put the code here and had the npc fork in from santa's key instead of replacing
//a bigger npc. (also santa's key works just fine like in vanilla on top of it)
//also if you change the size of the code above you need to shift the offsets to match in
//money_npc.txt and 

inc npc.objecttimer
cmp npc.objecttimer, 3
jl :mon_render_plz
mov npc.objecttimer, 0
inc npc.framenum
cmp npc.framenum, 5
jl :frame_ok
mov npc.framenum, 0
:frame_ok

:money_npc
mov eax, playerXpos
mov ebx, npc.X
sub eax, ebx
cmp eax, -1000
jl :not_in_range
cmp eax, 1000
jg :not_in_range
mov eax, playerYpos
mov ebx, npc.Y
sub eax, ebx
cmp eax, -1000
jl :not_in_range
cmp eax, 1000
jg :not_in_range
mov eax, npc.direction
add [Money_owned], eax
mov npc.inuse, 0
push 1
push E
call playsound
add esp, 8
jmp :end_of_code

:not_in_range
:mon_render_plz
mov eax, npc.framenum
mov edx, 10 
imul eax,edx   
mov npc.displayL, eax
add eax, 10
mov npc.displayR, eax 
CMP npc.direction,5
JE :mon_medium_exp_render
JL :mon_little_render
mov edx, 20
jmp :mon_render_UD
:mon_little_render
xor edx, edx
JMP :mon_render_UD
:mon_medium_exp_render
mov edx, 10
JMP :mon_render_UD
:mon_render_UD
add edx, C0 //U_framerect_distance
mov npc.displayU, edx
add edx, 10
mov npc.displayD, edx
jmp :end_of_code

